package com.atguigu.srb.core.controller.admin;


import com.alibaba.excel.EasyExcel;
import com.atguigu.common.exception.BusinessException;
import com.atguigu.common.result.ResponseEnum;
import com.atguigu.common.result.Result;
import com.atguigu.srb.core.pojo.DTO.ExcelDictDTO;
import com.atguigu.srb.core.pojo.entity.Dict;
import com.atguigu.srb.core.service.DictService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jdk.nashorn.internal.ir.RuntimeNode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;

/**
 * <p>
 * 数据字典 前端控制器
 * </p>
 *
 * @author ZLHao
 * @since 2021-07-12
 */
@Api(tags = "数据字典管理")
@RestController
@RequestMapping("admin/core/dict")

@Slf4j
public class AdminDictController {

    @Autowired
    private DictService dictService;


    @ApiOperation("Excel的数据导入")
    @PostMapping("/importData")
    public Result batchImport(@RequestParam("file") MultipartFile file) {

        try {
            InputStream inputStream = file.getInputStream();

            dictService.importData(inputStream);
            return Result.ok().message("文件上传成功");
        } catch (IOException e) {
            throw new BusinessException(ResponseEnum.UPLOAD_ERROR, e);
        }

    }

    @ApiOperation("数据导出")
    @GetMapping("/export")
    public Result export(HttpServletResponse response) throws IOException {

        try {
            // 设置响应头为xls格式
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            String fileName = URLEncoder.encode("mydict", "UTF-8").replaceAll("\\+", "%20");
            // 设置下载的副本
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
            EasyExcel.write(response.getOutputStream(), ExcelDictDTO.class).sheet("数据字典").doWrite(dictService.listDictData());
            return Result.ok().message("数据导出成功");
        } catch (IOException e) {
            throw new BusinessException(ResponseEnum.EXPORT_DATA_ERROR,e);
        }


    }

    /*树形数据的两种加载方案
             方案一:非延迟加裁

    需要后端返回的数据结构中包含嵌套数据，并且嵌套数据放在children属性中

            方案二;延迟加载

    不需要后端返回数据中包含嵌套数据，并且要定义布尔属性haschildren，
    表示当前节点是否包含子数据如果hasChildren为true，就表示当前节点包含子数据

    如果haschildrenfalse.就表示当前节点不包含子数据
    如果是false的。就表示当前节点不包含子数据
    如果当前节点包含子数据，那么点击当前节点的时候，就需要通过Load方法加载子数据
    */

    @ApiOperation("查询数据字典列表")
    @GetMapping("/listByParentId/{parentId}")
    public  Result listByParentId(@PathVariable Long parentId){
        List<Dict> dictList = dictService.listByParentId(parentId);

        return Result.ok().message("查询成功").data("list",dictList);

    }

}


